#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//int main()
//{
//	// 10000000000000000000000010000000
//	// 11111111111111111111111101111111
//	// 11111111111111111111111110000000
//	// 10000000 - a
//	// 11111111111111111111111110000000  对a进行整数提升，a是有符号的，高位补1
//	char a = -128;
//
//	printf("%u\n", a);
//	//%u 打印无符号的整数，%u的角度，它认为内存中存储的是无符号的整数
//
//	return 0;
//}
//#include<stdio.h>
//int main()
//{
//	// 00000000000000000000000010000000
//	// 01111111111111111111111101111111
//	// 01111111111111111111111110000000
//	// 10000000 - a
//	// 11111111111111111111111110000000  对a进行整数提升，a是有符号的，高位补1
//	char a = 128;
//
//	printf("%u\n", a);
//	//%u 打印无符号的整数，%u的角度，它认为内存中存储的是无符号的整数
//
//	return 0;
//}
//#include<stdio.h>
//int main()
//{
//	int a[4] = { 1,2,3,4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//
//	printf("%x,%x", ptr1[-1], *ptr2);
//	return 0;
//}
//int main()
//{
//	float f = 5.5f;
//	// S = 0
//	// E = 2  中间值为127
//	// M = 1.011
//	// 0100 0000 1011 0000 0000000000000000
//	// 0x40 b0 00 00
//	
//	return 0;
//}

//#include<stdio.h>
//struct Book
//{
//	char book_name[20];
//	char author[20];
//	float price;
//	char id[19];
//}b4, b5, b6;
//int main()
//{
//	struct Book b1 = { "鹏哥C语言","鹏哥",38.8f,"PG20240520" };
//	struct Book b2 = { .id = "DG20240520",.book_name = "蛋哥Linux",.author = "蛋哥",.price = 55.5f };
//
//	printf("%s %s %f %s\n", b1.book_name, b1.author, b1.price, b1.id);
//	printf("%s %s %f %s", b2.book_name, b2.author, b2.price, b2.id);
//
//	return 0;
//}

//#include<stdio.h>
//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//	printf("%zd\n", sizeof(struct S));
//	return 0;
//}

//#include<stdio.h>
//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//int main()
//{
//	struct A sa = { 0 };
//	int b = 0;
//	scanf("%d", &b);
//	sa._b = b;
//	printf("%d", sa._b);
//	return 0;
//}

//#include<stdio.h>
//enum Color
//{
//	RED = 2,
//	GREEN = 3,
//	BLUE = 4
//};
//int main()
//{
//	enum Color color = BLUE;
//
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int* p = (int*)calloc(10, sizeof(int));
//	if (p == NULL) {
//		perror("calloc");
//		return 1;
//	}
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", p[i]);
//	}
//	free(p);
//	p = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int* p = (int*)realloc(NULL, 20); //申请20个字节大小的空间
//	char* str = "hehe\n";
//	printf(str);
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int* p1 = (int*)malloc(10 * sizeof(int));
//	for (int i = 0; i < 10; i++) p1[i] = i + 1;
//	for (int i = 0; i < 10; i++) printf("%d ", p1[i]);
//	printf("\n");
//	free(p1);
//	p1 = NULL;
//
//	int* p2 = (int*)calloc(10, sizeof(int));
//	for (int i = 0; i < 10; i++) p2[i] = i + 10;
//	for (int i = 0; i < 10; i++) printf("%d ", p2[i]);
//	printf("\n");
//	int* tmp = (int*)realloc(p2, 20 * sizeof(int));
//	if (tmp == NULL) {
//		perror("realloc");
//		return 1;
//	}
//	p2 = tmp;
//	for (int i = 0; i < 20; i++) p2[i] = i + 10;
//	for (int i = 0; i < 20; i++) printf("%d ", p2[i]);
//	printf("\n");
//	free(p2);
//	p2 = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int** p2 = (int**)malloc(3 * sizeof(int*));
//	for (int i = 0; i < 3; i++)
//	{
//		p2[i] = (int*)malloc(5 * sizeof(int));
//	}
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			p2[i][j] = i * 5 + j;
//		}
//	}
//	for (int i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			printf("%d ", p2[i][j]);
//		}
//		printf("\n");
//	}
//	for (int i = 0; i < 3; i++) {
//		free(p2[i]);
//	}
//	free(p2);
//	p2 = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//union UN {
//	char a;
//	int b;
//};
//int check_sys()
//{
//	union UN un = { 0 };
//	un.b = 1;
//	return un.a;
//}
//int main()
//{
//	int tmp = check_sys();
//	if (tmp == 1) {
//		printf("小端\n");
//	}
//	else {
//		printf("大端\n");
//	}
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	int n;
//	int arr[];
//};
//int main()
//{
//	struct S* ps = (struct S*)malloc(sizeof(struct S) + 20 * sizeof(int));
//	if (ps == NULL) {
//		perror("malloc()");
//		return 1;
//	}
//	ps->n = 100;
//	for (int i = 0; i < 20; i++)
//	{
//		ps->arr[i] = i + 1;
//	}
//	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 40 * sizeof(int));
//	if (ptr != NULL) {
//		ps = ptr;
//		ptr = NULL;
//	}
//	else {
//		return 1;
//	}
//	for (int i = 0; i < 40; i++)
//	{
//		printf("%x ", ps->arr[i]);
//	}
//	free(ps);
//	ps = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	int n;
//	int* arr;
//};
//int main()
//{
//	struct S* ps = (struct S*)malloc(sizeof(struct S));
//	ps->arr = (int*)malloc(20 * sizeof(int));
//	for (int i = 0; i < 20; i++) {
//		ps->arr[i] = i + 1;
//	}
//	int* tmp = (int*)realloc(ps->arr, 40 * sizeof(int));
//	if (tmp != NULL) {
//		ps->arr = tmp;
//	}
//	else {
//		return 1;
//	}
//	for (int i = 0; i < 40; i++) {
//		printf("%x ", ps->arr[i]);
//	}
//	free(ps->arr);
//	free(ps);
//	ps = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	for (int i = 'a'; i <= 'z'; i++)
//	{
//		fputc(i, pf);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	int ch = 0;
//	while ((ch = fgetc(pf)) != EOF)
//	{
//		printf("%c ", ch);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//
//int main()
//{
//	int ch = fgetc(stdin); //从键盘（标准输入流）上读取
//	fputc(ch, stdout); //将字符输出（写）到屏幕（标准输出流）
//
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//
//	int count = fputs("I am a student\n", pf);
//	printf("%d\n", count);
//	count = fputs("are you ok?\n", pf);
//	printf("%d\n", count);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//
//	char arr[20] = "xxxxxxxxxxx";
//	char* s = fgets(arr, 10, pf);
//	printf("%s", arr);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	char arr[20] = { 0 };
//	fgets(arr, 5, stdin);
//	fputs(arr, stdout);
//
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	struct S s = { "lisi",18,88.0f };
//	fprintf(pf, "%s %d %f", s.name,s.age,s.score);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { 0 };
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	int count = fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
//	//int err = feof(pf);
//	printf("%d\n", count);
//	fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	char arr[100] = { 0 };
//	struct S s = { "wangwu",23,66.6f };
//	//将s中的各个数据转换成字符串，存放在arr中
//	int count = sprintf(arr, "%s %d %f", s.name, s.age, s.score);
//	printf("%s\n", arr);
//	printf("%d", count);
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	char arr[100] = { 0 };
//	struct S s = { "wangwu",23,66.6f };
//	//将s中的各个数据转换成字符串，存放在arr中
//	sprintf(arr, "%s %d %f", s.name, s.age, s.score);
//
//	//临时变量
//	struct S tmp = { 0 };
//	//从字符串arr中提取格式化的数据，存放在tmp中
//	sscanf(arr, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));
//	printf("%s %d %f", tmp.name, tmp.age, tmp.score);
//
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "cuihua",25,88.8f };
//	//以二进制的形式写到文件中
//
//	//打开文件
//	FILE* pf = fopen("data.txt", "wb");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	size_t count = fwrite(&s, sizeof(s), 1, pf);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	int s[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//以二进制的形式写到文件中
//
//	//打开文件
//	FILE* pf = fopen("data.txt", "wb");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	size_t count = fwrite(s, sizeof(s[0]), 5, pf);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "cuihua",25,88.8f };
//	//读取文件的二进制信息写到内存中
//
//	//打开文件
//	FILE* pf = fopen("data.txt", "rb");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	fread(&s, sizeof(s), 1, pf);
//	printf("%s %d %f", s.name, s.age, s.score);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "cuihua",25,88.8f };
//	//读取文件的二进制信息写到内存中
//
//	//打开文件
//	FILE* pf = fopen("data.txt", "rb");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	//读文件
//	fread(&s, sizeof(s), 1, pf);
//	printf("%s %d %f", s.name, s.age, s.score);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//定位文件指针
//	fseek(pf, 4, SEEK_SET);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	fseek(pf, -4, SEEK_CUR);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	fseek(pf, -1, SEEK_END);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//
//	fseek(pf, 4, SEEK_SET);
//	int ret = ftell(pf);
//	printf("%d\n", ret);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//
//	int ch = 0;
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	rewind(pf); //让文件指针回到文件的起始位置
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL) {
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//定位文件指针
//	//fseek(pf, 4, SEEK_SET);
//	//fseek(pf, 2, SEEK_CUR);
//	fseek(pf, -2, SEEK_END);
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	//输出文件指针相较于文件的起始位置的偏移量
//	printf("%d\n", ftell(pf));
//
//	rewind(pf); //将文件指针重新定位到文件的起始位置
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//enum {
//	SIZE = 5
//};
//int main(void)
//{
//	double a[SIZE] = { 1,2,3,4,5 };
//	FILE* fp = fopen("test.bin", "wb");
//	fwrite(a, sizeof * a, SIZE, fp);
//	fclose(fp);
//
//	double b[SIZE];
//	fp = fopen("test.bin", "rb");
//	size_t ret = fread(b, sizeof * b, SIZE + 1, fp);
//	if (ret == SIZE) {
//		for (int i = 0; i < SIZE; i++) {
//			printf("%lf ", b[i]);
//		}
//		printf("\n");
//	}
//	if (feof(fp)) {
//		printf("读取到文件末尾\n");
//	}
//	else if (ferror(fp)) {
//		printf("读取文件错误\n");
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//int main(void)
//{
//	int c; // 注意：int，非char，要求处理EOF
//	FILE* fp = fopen("test.txt", "r");
//	if (!fp) {
//		perror("File opening failed");
//		return EXIT_FAILURE;
//	}
//	//fgetc 当读取失败的时候或者遇到文件结束的时候，都会返回EOF
//	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
//	{
//		putchar(c);
//	}
//	//判断是什么原因结束的
//	if (ferror(fp))
//		puts("I/O error when reading");
//	else if (feof(fp))
//		puts("End of file reached successfully");
//	fclose(fp);
//}

//#include <stdio.h>
//enum { SIZE = 5 };
//int main(void)
//{
//	double a[SIZE] = { 1.,2.,3.,4.,5. };
//	FILE* fp = fopen("test.bin", "wb"); // 必须用二进制模式
//	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组
//	fclose(fp);
//	double b[SIZE];
//	fp = fopen("test.bin", "rb");
//	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组
//	if (ret_code == SIZE) {
//		puts("Array read successfully, contents: ");
//		for (int n = 0; n < SIZE; ++n)
//			printf("%f ", b[n]);
//		putchar('\n');
//	}
//	else { // error handling
//		if (feof(fp))
//			printf("Error reading test.bin: unexpected end of file\n");
//		else if (ferror(fp)) {
//			perror("Error reading test.bin");
//		}
//	}
//	fclose(fp);
//	fp = NULL;
//	return 0;
//}

//#include <stdio.h>
//#include <windows.h>
////VS2022 WIN11环境测试
//int main()
//{
//	FILE* pf = fopen("test.txt", "w");
//	fputs("abcdef", pf);//先将代码放在输出缓冲区
//	printf("睡眠10秒-已经写数据了，打开test.txt文件，发现文件没有内容\n");
//	Sleep(10000);
//	printf("刷新缓冲区\n");
//	fflush(pf);//刷新缓冲区时，才将输出缓冲区的数据写到⽂件（磁盘）
//	//注：fflush 在高版本的VS上不能使用了
//	printf("再睡眠10秒-此时，再次打开test.txt⽂件，文件有内容了\n");
//	Sleep(10000);
//	fclose(pf);
//	//注：fclose在关闭文件的时候，也会刷新缓冲区
//	pf = NULL;
//	return 0;
//}

#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE* pf = fopen("data.txt", "w+");
	if (pf == NULL) {
		perror("fopen");
		return 1;
	}
	for (int i = 'a'; i <= 'z'; i++) {
		fputc(i, pf);
	}
	fflush(pf); //刷新缓冲区
	//此时文件指针指向文件末尾，要继续读文件，必须让文件指针指向文件的起始位置
	rewind(pf); 
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF) {
		printf("%c ", ch);
	}
	printf("\n");

	//读完文件想继续写文件，先将文件指针定位到指定位置
	fseek(pf, 2, SEEK_SET);
	fputs("hello", pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

//#include<stdio.h>
//#include<stdlib.h>
//enum {
//	SIZE = 5
//};
//int main(void)
//{
//	double a[SIZE] = { 1,2,3,4,5 };
//	FILE* fp = fopen("test.bin", "wb");
//	fwrite(a, sizeof * a, SIZE, fp);
//	fclose(fp);
//
//	double b[SIZE];
//	fp = fopen("test.bin", "rb");
//	size_t ret = fread(b, sizeof * b, SIZE, fp);
//	if (ret == SIZE) {
//		for (int i = 0; i < SIZE; i++) {
//			printf("%lf ", b[i]);
//		}
//		printf("\n");
//	}
//	else {
//		if (feof(fp)) {
//			printf("读取到文件末尾\n");
//		}
//		else if (ferror(fp)) {
//			printf("读取文件错误\n");
//		}
//	}
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main(void)
//{
//	//打开文件
//	FILE* pfread = fopen("test1.txt", "r");
//	if (pfread == NULL) {
//		perror("fopen\n");
//		return 1;
//	}
//	FILE* pfwrite = fopen("test2.txt", "w");
//	if (pfwrite == NULL) {
//		perror("fopen\n");
//		fclose(pfread);
//		return 1;
//	}
//	int ch = 0;
//	while ((ch = fgetc(pfread)) != EOF) {
//		fputc(ch, pfwrite);
//	}
//
//	//关闭文件
//	fclose(pfread);
//	pfread = NULL;
//	fclose(pfwrite);
//	pfwrite = NULL;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int main(void)
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL) {
//		perror("fopen\n");
//		return 1;
//	}
//	int ch = 0;
//	while ((ch = fgetc(pf)) != EOF) {
//		printf("%c ", ch);
//	}
//	int ret = feof(pf);
//	printf("%d\n", ret);
//	ret = ferror(pf);
//	printf("%d\n", ret);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}